package com.xn.app.muying.sqlite;

import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * 数据库类
 */
public class DatabaseHelper extends SQLiteOpenHelper// 继承SQLiteOpenHelper类
{

    // 数据库版本号
    private static final int DATABASE_VERSION = 4;
    // 数据库名
    private static final String DATABASE_NAME = "beier.db";
    //用户信息表
    public static final String USER_TABLE = "user";
    //数据缓存表
    public static final String CACHE_TABLE = "cache";
    //体温监测设置表
    public static final String TEMPERATRUE_SET_TABLE = "temperature_set";
    //体温监测数据表
    public static final String TEMPERATRUE_DATA_TABLE = "temperature_data";

    // 构造函数，调用父类SQLiteOpenHelper的构造函数
    public DatabaseHelper(Context context, String name, CursorFactory factory,
                          int version, DatabaseErrorHandler errorHandler) {
        super(context, name, factory, version, errorHandler);

    }

    public DatabaseHelper(Context context, String name, CursorFactory factory,
                          int version) {
        super(context, name, factory, version);
        // SQLiteOpenHelper的构造函数参数：
        // context：上下文环境
        // name：数据库名字
        // factory：游标工厂（可选）
        // version：数据库模型版本号
    }

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // 数据库实际被创建是在getWritableDatabase()或getReadableDatabase()方法调用时
        // CursorFactory设置为null,使用系统默认的工厂类
    }

    // 继承SQLiteOpenHelper类,必须要覆写的三个方法：onCreate(),onUpgrade(),onOpen()
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 调用时间：数据库第一次创建时onCreate()方法会被调用
        // onCreate方法有一个 SQLiteDatabase对象作为参数，根据需要对这个对象填充表和初始化数据
        // 这个方法中主要完成创建数据库后对数据库的操作
        // 构建创建表的SQL语句（可以从SQLite Expert工具的DDL粘贴过来加进StringBuffer中）
        // 即便程序修改重新运行，只要数据库已经创建过，就不会再进入这个onCreate方法
        String sql = null;
        /**创建用户表*/
        sql = sqlString(USER_TABLE);
        // 执行创建表的SQL语句
        db.execSQL(sql);
        /**创建数据缓存表*/
        sql = sqlString(CACHE_TABLE);
        // 执行创建表的SQL语句
        db.execSQL(sql);
        /**创建体温监测设置表*/
        sql = sqlString(TEMPERATRUE_SET_TABLE);
        // 执行创建表的SQL语句
        db.execSQL(sql);
        /**创建体温监测设置表*/
        sql = sqlString(TEMPERATRUE_DATA_TABLE);
        // 执行创建表的SQL语句
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 调用时间：如果DATABASE_VERSION值被改为别的数,系统发现现有数据库版本不同,即会调用onUpgrade
        // onUpgrade方法的三个参数，一个 SQLiteDatabase对象，一个旧的版本号和一个新的版本号
        // 这样就可以把一个数据库从旧的模型转变到新的模型
        // 这个方法中主要完成更改数据库版本的操作
        // 上述做法简单来说就是，通过检查常量值来决定如何，升级时删除旧表，然后调用onCreate来创建新表
        // 一般在实际项目中是不能这么做的，正确的做法是在更新数据表结构时，还要考虑用户存放于数据库中的数据不丢失

        String sql = null;

        /**查询用户表是否存在*/
        if (selectNull(db, USER_TABLE) != 0) {
            //查询是否存在会员列
            if (!checkColumnExist(db, USER_TABLE, "isVIP")) {
                /**如果表中没有会员字段，则向用户信息表中添加会员字段
                 * isVIP是否是会员   isCanTrialVIP是否可以试用会员  vipEndTime 会员截止日期
                 * */
                db.execSQL("alter table " + USER_TABLE + " add isVIP INTEGER");//0代表false
                db.execSQL("alter table " + USER_TABLE + " add isCanTrialVIP INTEGER");//0代表false
                db.execSQL("alter table " + USER_TABLE + " add vipEndTime text");
            }
            //查询是否存在id字段
            if (!checkColumnExist(db, USER_TABLE, "id")) {
                /**如果表中没有id字段，则向用户信息表中添加id字段
                 * id 用户主键   openId 用户主键(预留)
                 * */
                db.execSQL("alter table " + USER_TABLE + " add id text");
                db.execSQL("alter table " + USER_TABLE + " add openId text");
            }
        } else {
            //如果不存在，则创建
            sql = sqlString(USER_TABLE);
            // 执行创建表的SQL语句
            db.execSQL(sql);
        }

        /**查询数据缓存表是否存在*/
        if (selectNull(db, CACHE_TABLE) != 0) {

        } else {
            //如果不存在，则创建
            sql = sqlString(CACHE_TABLE);
            // 执行创建表的SQL语句
            db.execSQL(sql);
        }

        /**查询体温监测设置表是否存在*/
        if (selectNull(db, TEMPERATRUE_SET_TABLE) != 0) {

        } else {
            //如果不存在，则创建
            sql = sqlString(TEMPERATRUE_SET_TABLE);
            // 执行创建表的SQL语句
            db.execSQL(sql);
        }

        /**查询体温监测数据表是否存在*/
        if (selectNull(db, TEMPERATRUE_DATA_TABLE) != 0) {
            //查询表中是否有该字段
            if (!checkColumnExist(db, TEMPERATRUE_DATA_TABLE, "State")) {
                //如果不存在该列，则删除该表，重新创建
                sql=" DROP TABLE IF EXISTS "+TEMPERATRUE_DATA_TABLE;
                db.execSQL(sql);
                //如果不存在，则创建
                sql = sqlString(TEMPERATRUE_DATA_TABLE);
                // 执行创建表的SQL语句
                db.execSQL(sql);
            }
        } else {
            //如果不存在，则创建
            sql = sqlString(TEMPERATRUE_DATA_TABLE);
            // 执行创建表的SQL语句
            db.execSQL(sql);
        }
    }

    /**
     * 查询表是否为空
     *
     * @param data  数据库对象
     * @param tableName  表名
     */

    public int selectNull(SQLiteDatabase data, String tableName) {
        int number;
        Cursor c = data.rawQuery("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='" + tableName + "'", null);
        number = c.getCount();
        return number;
    }

    /**
     * 方法1：检查某表列是否存在
     *
     * @param db
     * @param tableName  表名
     * @param columnName 列名
     * @return
     */
    private boolean checkColumnExist(SQLiteDatabase db, String tableName
            , String columnName) {
        boolean result = false;
        Cursor cursor = null;
        try {
            //查询一行
            cursor = db.rawQuery("SELECT * FROM " + tableName + " LIMIT 0"
                    , null);
            result = cursor != null && cursor.getColumnIndex(columnName) != -1;
        } catch (Exception e) {
        } finally {
            if (null != cursor && !cursor.isClosed()) {
                cursor.close();
            }
        }

        return result;
    }

    /**
     * 筛选sql语句
     *
     * @param tableName  表名
     * @return  sql语句
     */
    public String sqlString(String tableName) {
        String sql = null;
        switch (tableName) {
            //创建用户表
            case USER_TABLE:
                /**
                 * _id主键  tel用户账号   id用户主键 openId用户主键(备用) identityId身份证号   name姓名   access_token账号标识  token_type账号标识属性  pregnancyStatus孕期状态参数  pregnancyStatusDisplay孕期状态
                 * preDeliveryDate预产期  antenatalCareHospitalId医院ID  antenatalCareHospitalName医院名称  babyBirthday宝宝生日  babyGender宝宝性别   isVIP是否是会员
                 * isCanTrialVIP是否可以试用会员  vipEndTime 会员截止日期
                 */
                sql = "create table " + USER_TABLE
                        + "(_id integer primary key autoincrement,tel text,id text,openId text,identityId text,name text,"
                        + "access_token text,token_type text,pregnancyStatus text," +
                        "pregnancyStatusDisplay text,preDeliveryDate text,antenatalCareHospitalId text," +
                        "antenatalCareHospitalName text,babyBirthday text,babyGender text,isVIP INTEGER,isCanTrialVIP INTEGER,vipEndTime text);";
                break;
            //创建数据缓存表
            case CACHE_TABLE:
                /**
                 * _id 主键  Banner主页轮播图  prompt提示栏  Today_know主页今日知识  classroom蓓儿课堂
                 **/
                sql = "create table " + CACHE_TABLE
                        + "(_id integer primary key autoincrement,Banner text,prompt text,Today_know text,classroom text);";
                break;
            //创建体温监测设置表
            case TEMPERATRUE_SET_TABLE:
                /**
                 *  _id 主键  FeverWarning 发烧预警温度  SleepWarning 蹬被子预警温度  ShowerWarning 洗澡预警温度 RemindWay 提醒方式  Devices 绑定的设备  DevicesList 所有新设备
                 */
                sql = "create table " + TEMPERATRUE_SET_TABLE
                        + "(_id integer primary key autoincrement,FeverWarning text,SleepWarning text,ShowerWarning text,RemindWay text,Devices text,DevicesList text);";
                break;
            //创建体温监测数据存储表
            case TEMPERATRUE_DATA_TABLE:
                /**
                 *  _id 主键  Type 监测类型  State 监测状态  StartTime 开始时间  EndTime 结束时间  TotalTime 监测总时长 MonitoringData 监测数据  MonitoringDataTime  监测数据对应时间  WarningRecord 监测预警记录 Note 备注
                 *  Method 处理措施 ImgRecord 图片记录
                 */
                sql = "create table " + TEMPERATRUE_DATA_TABLE
                        + "(_id integer primary key autoincrement,Type integer,State integer,StartTime text,EndTime text,TotalTime text,MonitoringData text,MonitoringDataTime text,WarningRecord text" +
                        ",Note text,Method text,ImgRecord text);";
                break;

        }
        return sql;
    }
}
